package niumao.minecraft.uhc.recipes;

import niumao.minecraft.uhc.Main;
import niumao.minecraft.uhc.Util;
import org.bukkit.*;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeModifier;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.*;
import org.bukkit.inventory.meta.*;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import java.util.*;

public class UHCItem {
    private static final Main plugin = Main.getPlugin(Main.class);
    public static ArrayList<ItemStack> allItems = new ArrayList<>();
    public static ArrayList<Recipe> allRecipes = new ArrayList<>();

    public void setAllItems() {
        allItems.clear();
        allItems.add(ApprenticeHelmet());
        allItems.add(ApprenticeChestPlate());
        allItems.add(ApprenticeLeggings());
        allItems.add(ApprenticeBoots());
        allItems.add(ApprenticeSword());
        allItems.add(ApprenticeBow());
        allItems.add(MasterCompass());
        allItems.add(VorpalSword());
        allItems.add(Sharpness());
        allItems.add(DragonSword());
        allItems.add(Protection());
        allItems.add(Projectile_Protection());
        allItems.add(DragonArmor());
        allItems.add(SpikedArmor());
        allItems.add(SevenLeagueBoots());
        allItems.add(TarnHelm());
        allItems.add(PhilosopherPickAxe());
        allItems.add(Velocity());
        allItems.add(IronPickaxe());
        allItems.add(LumberAxe());
        allItems.add(FlaskofIchor());
        allItems.add(Exodus());
        allItems.add(Leviathan());
        allItems.add(Perun());
        allItems.add(Excalibur());
        allItems.add(Anduril());
        allItems.add(Scythe());
        allItems.add(Machina());
        allItems.add(KingofRod());
        allItems.add(Vidar());
        allItems.add(Vitality());
        allItems.add(Miner());
        allItems.add(Bloodlust());
        allItems.add(Modular());
        allItems.add(Hermes());
        allItems.add(Barbarian());
        allItems.add(Cupid());
        allItems.add(Artemis());
        allItems.add(GoldenHead());
        allItems.add(Power());
        allItems.add(FusionArmor());
        allItems.add(Nectar());
        allItems.add(Cornucopia());
        allItems.add(LeatherEconomy());
        allItems.add(DustOfLight());
        allItems.add(BrewingArtifact());
        allItems.add(DeliciousSteak());
        allItems.add(DeliciousPorkChop());
        allItems.add(DeliciousMutton());
        allItems.add(DeliciousChicken());
        allItems.add(DeliciousRabbit());
        allItems.add(DeliciousCod());
        allItems.add(DeliciousSalmon());
        allItems.add(FlamingArtifact());
        allItems.add(IronPack());
        allItems.add(Obsidian());
        allItems.add(EnlighteningPack());
        allItems.add(LightAnvil());
        allItems.add(LightEnchantmentTable());
        allItems.add(Temptation());
        allItems.add(LightApple());
        allItems.add(LightEnchantingApple());
        allItems.add(ArrowEconomy());
        allItems.add(Saddle());
        allItems.add(GoldPack());
        allItems.add(SugarRush());
        allItems.add(Elytra());
    }

    public void setRecipe() {
        Bukkit.resetRecipes();
        allRecipes.clear();
        allRecipes.add(ApprenticeHelmetRecipe());
        allRecipes.add(ApprenticeChestPlateRecipe());
        allRecipes.add(ApprenticeLeggingsRecipe());
        allRecipes.add(ApprenticeBootsRecipe());
        allRecipes.add(ApprenticeSwordRecipe());
        allRecipes.add(ApprenticeBowRecipe());
        allRecipes.add(MasterCompassRecipe());
        allRecipes.add(VorpalSwordRecipe());
        allRecipes.add(SharpnessRecipe());
        allRecipes.add(DragonSwordRecipe());
        allRecipes.add(ProtectionRecipe());
        allRecipes.add(Projectile_ProtectionRecipe());
        allRecipes.add(DragonArmorRecipe());
        allRecipes.add(SpikedArmorRecipe());
        allRecipes.add(SevenLeagueBootsRecipe());
        allRecipes.add(TarnHelmRecipe());
        allRecipes.add(PhilosopherPickAxeRecipe());
        allRecipes.add(VelocityRecipe());
        allRecipes.add(IronPickaxeRecipe());
        allRecipes.add(LumberAxeRecipe());
        allRecipes.add(FlaskofIchorRecipe());
        allRecipes.add(ExodusRecipe());
        allRecipes.add(LeviathanRecipe());
        allRecipes.add(PerunRecipe());
        allRecipes.add(ExcaliburRecipe());
        allRecipes.add(AndurilRecipe());
        allRecipes.add(ScytheRecipe());
        allRecipes.add(MachinaRecipe());
        allRecipes.add(KingofRodRecipe());
        allRecipes.add(VidarRecipe());
        allRecipes.add(VitalityRecipe());
        allRecipes.add(MinerRecipe());
        allRecipes.add(BloodlustRecipe());
        allRecipes.add(ModularRecipe());
        allRecipes.add(HermesRecipe());
        allRecipes.add(BarbarianRecipe());
        allRecipes.add(CupidRecipe());
        allRecipes.add(ArtemisRecipe());
        allRecipes.add(GoldenHeadRecipe());
        allRecipes.add(PowerRecipe());
        allRecipes.add(FusionArmorRecipe());
        allRecipes.add(NectarRecipe());
        allRecipes.add(CornucopiaRecipe());
        allRecipes.add(LeatherRecipe());
        allRecipes.add(DustRecipe());
        allRecipes.add(WartRecipe());
        allRecipes.add(SteakRecipe());
        allRecipes.add(PorkChopRecipe());
        allRecipes.add(MuttonRecipe());
        allRecipes.add(ChickenRecipe());
        allRecipes.add(RabbitRecipe());
        allRecipes.add(CodRecipe());
        allRecipes.add(SalmonRecipe());
        allRecipes.add(FlamingRecipe());
        allRecipes.add(IronPackRecipe());
        allRecipes.add(ObsidianRecipe());
        allRecipes.add(ExperienceBottleRecipe());
        allRecipes.add(LightAnvilRecipe());
        allRecipes.add(LightEnchantmentTableRecipe());
        allRecipes.add(TemptationRecipe());
        allRecipes.add(LightAppleRecipe());
        allRecipes.add(LightEnchantingAppleRecipe());
        allRecipes.add(ArrowRecipe());
        allRecipes.add(SaddleRecipe());
        allRecipes.add(GoldPackRecipe());
        allRecipes.add(SugarRushRecipe());
        allRecipes.add(ElytraRecipe());
        for (Recipe recipe : allRecipes) Bukkit.addRecipe(recipe);
    }

    private ItemStack getItemStack(ItemStack apprentice, ItemMeta apprenticeMeta) {
        assert apprenticeMeta != null;
        apprenticeMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 1, true);
        apprenticeMeta.addEnchant(Enchantment.PROTECTION_FIRE, 1, true);
        apprenticeMeta.addEnchant(Enchantment.PROTECTION_EXPLOSIONS, 1, true);
        apprenticeMeta.addEnchant(Enchantment.PROTECTION_PROJECTILE, 1, true);
        apprentice.setItemMeta(apprenticeMeta);
        return apprentice;
    }

    public ItemStack ApprenticeHelmet() {
        ItemStack helmet = new ItemStack(Material.IRON_HELMET);
        ItemMeta helmetMeta = helmet.getItemMeta();
        assert helmetMeta != null;

        helmetMeta.setDisplayName(Util.getStr("ApprenticeHelmet"));
        return getItemStack(helmet, helmetMeta);
    }

    public ShapedRecipe ApprenticeHelmetRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(ApprenticeHelmet());
        recipe.shape("III", "IRI");
        recipe.setIngredient('I', Material.IRON_INGOT);
        recipe.setIngredient('R', Material.REDSTONE_TORCH);
        return recipe;
    }

    public ItemStack ApprenticeChestPlate() {
        ItemStack chestPlate = new ItemStack(Material.IRON_CHESTPLATE);
        ItemMeta chestPlateMeta = chestPlate.getItemMeta();
        assert chestPlateMeta != null;

        chestPlateMeta.setDisplayName(Util.getStr("ApprenticeChestPlate"));
        return getItemStack(chestPlate, chestPlateMeta);
    }

    public ShapedRecipe ApprenticeChestPlateRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(ApprenticeChestPlate());
        recipe.shape("IRI", "III", "III");
        recipe.setIngredient('I', Material.IRON_INGOT);
        recipe.setIngredient('R', Material.REDSTONE_TORCH);
        return recipe;
    }

    public ItemStack ApprenticeLeggings() {
        ItemStack leggings = new ItemStack(Material.IRON_LEGGINGS);
        ItemMeta leggingsMeta = leggings.getItemMeta();
        assert leggingsMeta != null;
        leggingsMeta.setDisplayName(Util.getStr("ApprenticeLeggings"));
        return getItemStack(leggings, leggingsMeta);
    }

    public ShapedRecipe ApprenticeLeggingsRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(ApprenticeLeggings());
        recipe.shape("III", "IRI", "I I");
        recipe.setIngredient('I', Material.IRON_INGOT);
        recipe.setIngredient('R', Material.REDSTONE_TORCH);
        return recipe;
    }

    public ItemStack ApprenticeBoots() {
        ItemStack boots = new ItemStack(Material.IRON_BOOTS);
        ItemMeta bootsMeta = boots.getItemMeta();
        assert bootsMeta != null;
        bootsMeta.setDisplayName(Util.getStr("ApprenticeBoots"));
        return getItemStack(boots, bootsMeta);
    }

    public ShapedRecipe ApprenticeBootsRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(ApprenticeBoots());
        recipe.shape("IRI", "I I");
        recipe.setIngredient('I', Material.IRON_INGOT);
        recipe.setIngredient('R', Material.REDSTONE_TORCH);
        return recipe;
    }

    public ItemStack ApprenticeSword() {
        List<String> lore = Util.getStr("ApprenticeSword", true);

        ItemStack sword = new ItemStack(Material.IRON_SWORD);
        ItemMeta swordMeta = sword.getItemMeta();
        assert swordMeta != null;

        swordMeta.setDisplayName(Util.getStr("ApprenticeSword"));
        swordMeta.addEnchant(Enchantment.DAMAGE_ALL, 1, true);
        swordMeta.setLore(lore);
        sword.setItemMeta(swordMeta);
        return sword;
    }

    public ShapedRecipe ApprenticeSwordRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(ApprenticeSword());
        recipe.shape(" R ", " S ", " R ");
        recipe.setIngredient('R', Material.REDSTONE_BLOCK);
        recipe.setIngredient('S', Material.IRON_SWORD);
        return recipe;
    }

    public ItemStack ApprenticeBow() {
        List<String> lore = Util.getStr("ApprenticeBow", true);

        ItemStack bow = new ItemStack(Material.BOW);
        ItemMeta bowMeta = bow.getItemMeta();
        assert bowMeta != null;
        bowMeta.setDisplayName(Util.getStr("ApprenticeBow"));
        bowMeta.setCustomModelData(0);
        bowMeta.setLore(lore);
        bow.setItemMeta(bowMeta);
        return bow;
    }

    public ShapedRecipe ApprenticeBowRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(ApprenticeBow());
        recipe.shape(" RS", "R S", " RS");
        recipe.setIngredient('R', Material.REDSTONE_TORCH);
        recipe.setIngredient('S', Material.STRING);
        return recipe;
    }

    public ItemStack MasterCompass() {
        ItemStack compass = new ItemStack(Material.COMPASS);
        ItemMeta compassMeta = compass.getItemMeta();

        assert compassMeta != null;
        compassMeta.setLore(Util.getStr("MasterCompass", true));
        compassMeta.addEnchant(Enchantment.DURABILITY, 0, true);
        compassMeta.setDisplayName(Util.getStr("MasterCompass"));
        compassMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        compass.setItemMeta(compassMeta);
        return compass;
    }

    public ShapedRecipe MasterCompassRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(MasterCompass());
        recipe.shape("RTR", "RCR", "RRR");
        recipe.setIngredient('R', Material.REDSTONE);
        recipe.setIngredient('T', Material.REDSTONE_TORCH);
        recipe.setIngredient('C', Material.COMPASS);
        return recipe;
    }

    public ItemStack VorpalSword() {
        ItemStack vorpal = new ItemStack(Material.IRON_SWORD);
        ItemMeta vorpalMeta = vorpal.getItemMeta();
        assert vorpalMeta != null;
        vorpalMeta.addEnchant(Enchantment.DAMAGE_UNDEAD, 2, true);
        vorpalMeta.addEnchant(Enchantment.LOOT_BONUS_MOBS, 1, true);
        vorpalMeta.addEnchant(Enchantment.DAMAGE_ARTHROPODS, 2, true);
        vorpalMeta.setDisplayName(Util.getStr("VorpalSword"));
        vorpal.setItemMeta(vorpalMeta);
        return vorpal;
    }

    public ShapedRecipe VorpalSwordRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(VorpalSword());
        recipe.shape(" B ", " I ", " R ");
        recipe.setIngredient('B', Material.BONE);
        recipe.setIngredient('I', Material.IRON_SWORD);
        recipe.setIngredient('R', Material.ROTTEN_FLESH);
        return recipe;
    }

    public ItemStack Sharpness() {
        ItemStack sharpness = new ItemStack(Material.ENCHANTED_BOOK);
        EnchantmentStorageMeta sharpnessMeta = (EnchantmentStorageMeta) sharpness.getItemMeta();
        assert sharpnessMeta != null;
        sharpnessMeta.addStoredEnchant(Enchantment.DAMAGE_ALL, 1, true);
        sharpnessMeta.setDisplayName(Util.getStr("Sharpness"));
        sharpness.setItemMeta(sharpnessMeta);
        return sharpness;
    }

    public ShapedRecipe SharpnessRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Sharpness());
        recipe.shape("F  ", " PP", " PI");
        recipe.setIngredient('F', Material.FLINT);
        recipe.setIngredient('I', Material.IRON_SWORD);
        recipe.setIngredient('P', Material.PAPER);
        return recipe;
    }

    public ItemStack DragonSword() {
        ItemStack sword = new ItemStack(Material.DIAMOND_SWORD);
        ItemMeta swordMeta = sword.getItemMeta();
        assert swordMeta != null;
        swordMeta.setDisplayName(Util.getStr("DragonSword"));
        swordMeta.addAttributeModifier(Attribute.GENERIC_ATTACK_DAMAGE,
                new AttributeModifier(UUID.randomUUID(), "DragonSword", 8,
                        AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HAND));
        sword.setItemMeta(swordMeta);
        return sword;
    }

    public ShapedRecipe DragonSwordRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(DragonSword());
        recipe.shape(" B ", " S ", "OBO");
        recipe.setIngredient('B', Material.BLAZE_POWDER);
        recipe.setIngredient('S', Material.DIAMOND_SWORD);
        recipe.setIngredient('O', Material.OBSIDIAN);
        return recipe;
    }

    public ItemStack Protection() {
        ItemStack protection = new ItemStack(Material.ENCHANTED_BOOK);
        EnchantmentStorageMeta protectionMeta = (EnchantmentStorageMeta) protection.getItemMeta();
        assert protectionMeta != null;
        protectionMeta.addStoredEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 1, true);
        protectionMeta.setDisplayName(Util.getStr("Protection"));
        protection.setItemMeta(protectionMeta);
        return protection;
    }

    public ShapedRecipe ProtectionRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Protection());
        recipe.shape("   ", " PP", " PI");
        recipe.setIngredient('I', Material.IRON_INGOT);
        recipe.setIngredient('P', Material.PAPER);
        return recipe;
    }

    public ItemStack Projectile_Protection() {
        ItemStack projectile = new ItemStack(Material.ENCHANTED_BOOK);
        EnchantmentStorageMeta projectileMeta = (EnchantmentStorageMeta) projectile.getItemMeta();
        assert projectileMeta != null;
        projectileMeta.addStoredEnchant(Enchantment.PROTECTION_PROJECTILE, 1, true);
        projectileMeta.setDisplayName(Util.getStr("Projectile_Protection"));
        projectile.setItemMeta(projectileMeta);
        return projectile;
    }

    public ShapedRecipe Projectile_ProtectionRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Projectile_Protection());
        recipe.shape("   ", " PP", " PA");
        recipe.setIngredient('A', Material.ARROW);
        recipe.setIngredient('P', Material.PAPER);
        return recipe;
    }

    public ItemStack DragonArmor() {
        ItemStack dragonArmor = new ItemStack(Material.DIAMOND_CHESTPLATE);
        ItemMeta dragonArmorMeta = dragonArmor.getItemMeta();
        assert dragonArmorMeta != null;
        dragonArmorMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 4, true);
        dragonArmorMeta.setDisplayName(Util.getStr("DragonArmor"));
        dragonArmor.setItemMeta(dragonArmorMeta);
        return dragonArmor;
    }

    public ShapedRecipe DragonArmorRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(DragonArmor());
        recipe.shape(" M ", " C ", "OAO");
        recipe.setIngredient('M', Material.MAGMA_CREAM);
        recipe.setIngredient('C', Material.DIAMOND_CHESTPLATE);
        recipe.setIngredient('O', Material.OBSIDIAN);
        RecipeChoice AnvilChoice = new RecipeChoice.MaterialChoice(Material.ANVIL, Material.CHIPPED_ANVIL, Material.DAMAGED_ANVIL);
        recipe.setIngredient('A', AnvilChoice);
        return recipe;
    }

    public ItemStack SpikedArmor() {
        ItemStack spikedArmor = new ItemStack(Material.LEATHER_CHESTPLATE);
        ItemMeta spikedArmorMeta = spikedArmor.getItemMeta();
        assert spikedArmorMeta != null;
        spikedArmorMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 5, true);
        spikedArmorMeta.addEnchant(Enchantment.DURABILITY, 10, true);
        spikedArmorMeta.addEnchant(Enchantment.THORNS, 1, true);
        spikedArmorMeta.setDisplayName(Util.getStr("SpikedArmor"));
        spikedArmor.setItemMeta(spikedArmorMeta);
        return spikedArmor;
    }

    public ShapedRecipe SpikedArmorRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(SpikedArmor());
        recipe.shape(" L ", " C ", " A ");
        recipe.setIngredient('L', Material.LILY_PAD);
        recipe.setIngredient('C', Material.CACTUS);
        recipe.setIngredient('A', Material.LEATHER_CHESTPLATE);
        return recipe;
    }

    public ItemStack SevenLeagueBoots() {
        ItemStack sevenLeagueBoots = new ItemStack(Material.DIAMOND_BOOTS);
        ItemMeta sevenLeagueBootsMeta = sevenLeagueBoots.getItemMeta();
        assert sevenLeagueBootsMeta != null;
        sevenLeagueBootsMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 3, true);
        sevenLeagueBootsMeta.addEnchant(Enchantment.PROTECTION_FALL, 3, true);
        sevenLeagueBootsMeta.setDisplayName(Util.getStr("SevenLeagueBoots"));
        sevenLeagueBoots.setItemMeta(sevenLeagueBootsMeta);
        return sevenLeagueBoots;
    }

    public ShapedRecipe SevenLeagueBootsRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(SevenLeagueBoots());
        recipe.shape("FEF", "FBF", "FWF");
        recipe.setIngredient('F', Material.FEATHER);
        recipe.setIngredient('E', Material.ENDER_PEARL);
        recipe.setIngredient('B', Material.DIAMOND_BOOTS);
        recipe.setIngredient('W', Material.WATER_BUCKET);
        return recipe;
    }

    public ItemStack TarnHelm() {
        ItemStack tarnhelm = new ItemStack(Material.DIAMOND_HELMET);
        ItemMeta tarnhelmMeta = tarnhelm.getItemMeta();
        assert tarnhelmMeta != null;
        tarnhelmMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 1, true);
        tarnhelmMeta.addEnchant(Enchantment.PROTECTION_FIRE, 1, true);
        tarnhelmMeta.addEnchant(Enchantment.WATER_WORKER, 3, true);
        tarnhelmMeta.setDisplayName(Util.getStr("TarnHelm"));
        tarnhelm.setItemMeta(tarnhelmMeta);
        return tarnhelm;
    }

    public ShapedRecipe TarnHelmRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(TarnHelm());
        recipe.shape("DID", "DRD");
        recipe.setIngredient('D', Material.DIAMOND);
        recipe.setIngredient('I', Material.IRON_INGOT);
        recipe.setIngredient('R', Material.REDSTONE_BLOCK);
        return recipe;
    }

    public ItemStack PhilosopherPickAxe() {
        ItemStack philosopherPickAxe = new ItemStack(Material.DIAMOND_PICKAXE);
        Damageable philosopherDamage = (Damageable) philosopherPickAxe.getItemMeta();
        assert philosopherDamage != null;
        philosopherDamage.setDamage(1561 - 2);

        ItemMeta philosopherPickAxeMeta = (ItemMeta) philosopherDamage;
        philosopherPickAxeMeta.addEnchant(Enchantment.LOOT_BONUS_BLOCKS, 2, true);
        philosopherPickAxeMeta.setDisplayName(Util.getStr("PhilosopherPickAxe"));

        philosopherPickAxe.setItemMeta(philosopherPickAxeMeta);
        return philosopherPickAxe;
    }

    public ShapedRecipe PhilosopherPickAxeRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(PhilosopherPickAxe());
        recipe.shape("IGI", "LSL", " S ");
        recipe.setIngredient('I', Material.IRON_ORE);
        recipe.setIngredient('G', Material.GOLD_ORE);
        recipe.setIngredient('S', Material.STICK);
        recipe.setIngredient('L', Material.LAPIS_BLOCK);
        return recipe;
    }

    public ItemStack Velocity() {
        ItemStack velocity = new ItemStack(Material.SPLASH_POTION);
        PotionMeta velocityMeta = (PotionMeta) velocity.getItemMeta();

        assert velocityMeta != null;
        velocityMeta.addCustomEffect(new PotionEffect(PotionEffectType.SPEED, 12 * 20, 2), false);
        velocityMeta.setDisplayName(Util.getStr("Velocity"));
        velocityMeta.setColor(Color.GREEN);

        velocity.setItemMeta(velocityMeta);
        return velocity;
    }

    public ShapedRecipe VelocityRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Velocity());
        recipe.shape(" C ", " S ", " B ");
        recipe.setIngredient('C', Material.COCOA_BEANS);
        recipe.setIngredient('S', Material.SUGAR);
        recipe.setIngredient('B', Material.GLASS_BOTTLE);
        return recipe;
    }

    public ItemStack IronPickaxe() {
        ItemStack item = new ItemStack(Material.IRON_PICKAXE);
        ItemMeta itemMeta = item.getItemMeta();
        assert itemMeta != null;
        itemMeta.setDisplayName(Util.getStr("IronPickaxe"));
        itemMeta.addEnchant(Enchantment.DIG_SPEED, 1, true);

        item.setItemMeta(itemMeta);
        return item;
    }

    public ShapedRecipe IronPickaxeRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(IronPickaxe());
        recipe.shape("III", "CSC", " S ");
        recipe.setIngredient('I', Material.IRON_ORE);
        RecipeChoice CoalChoice = new RecipeChoice.MaterialChoice(Material.COAL, Material.CHARCOAL);
        recipe.setIngredient('C', CoalChoice);
        recipe.setIngredient('S', Material.STICK);
        return recipe;
    }

    public ItemStack LumberAxe() {
        ItemStack lumberAxe = new ItemStack(Material.IRON_AXE);
        ItemMeta lumberAxeMeta = lumberAxe.getItemMeta();

        assert lumberAxeMeta != null;
        lumberAxeMeta.setDisplayName(Util.getStr("LumberAxe"));
        lumberAxeMeta.setLore(Util.getStr("LumberAxe", true));

        lumberAxe.setItemMeta(lumberAxeMeta);
        return lumberAxe;
    }

    public ShapedRecipe LumberAxeRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(LumberAxe());
        recipe.shape("IIF", "IS ", " S ");
        recipe.setIngredient('I', Material.IRON_INGOT);
        recipe.setIngredient('F', Material.FLINT);
        recipe.setIngredient('S', Material.STICK);
        return recipe;
    }

    public ItemStack FlaskofIchor() {
        ItemStack flaskofIchor = new ItemStack(Material.SPLASH_POTION);
        PotionMeta flaskofIchorMeta = (PotionMeta) flaskofIchor.getItemMeta();

        assert flaskofIchorMeta != null;
        flaskofIchorMeta.addCustomEffect(new PotionEffect(PotionEffectType.HARM, 0, 2), true);
        flaskofIchorMeta.setDisplayName(Util.getStr("FlaskofIchor"));
        flaskofIchorMeta.setColor(Color.PURPLE);
        flaskofIchor.setItemMeta(flaskofIchorMeta);
        return flaskofIchor;
    }

    public ShapedRecipe FlaskofIchorRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(FlaskofIchor());
        recipe.shape(" P ", "MBM", " I ");
        recipe.setIngredient('P', Material.PLAYER_HEAD);
        recipe.setIngredient('M', Material.BROWN_MUSHROOM);
        recipe.setIngredient('B', Material.GLASS_BOTTLE);
        recipe.setIngredient('I', Material.INK_SAC);
        return recipe;
    }

    public ItemStack Exodus() {
        ItemStack exodus = new ItemStack(Material.DIAMOND_HELMET);
        ItemMeta exodusMeta = exodus.getItemMeta();

        assert exodusMeta != null;
        exodusMeta.setDisplayName(Util.getStr("Exodus"));
        exodusMeta.addEnchant(Enchantment.DURABILITY, 3, true);
        exodusMeta.setLore(Util.getStr("Exodus", true));

        exodus.setItemMeta(exodusMeta);
        return exodus;
    }

    public ShapedRecipe ExodusRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Exodus());
        recipe.shape("DDD", "DPD", "ECE");
        recipe.setIngredient('D', Material.DIAMOND);
        recipe.setIngredient('P', Material.PLAYER_HEAD);
        recipe.setIngredient('E', Material.EMERALD);
        recipe.setIngredient('C', Material.GOLDEN_CARROT);
        return recipe;
    }

    public ItemStack Leviathan() {
        ItemStack leviathan = new ItemStack(Material.DIAMOND_LEGGINGS);
        ItemMeta leviathanMeta = leviathan.getItemMeta();
        Objects.requireNonNull(leviathanMeta).setLore(Util.getStr("Leviathan", true));

        leviathanMeta.setDisplayName(Util.getStr("Leviathan"));
        leviathanMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 4, true);
        leviathanMeta.addEnchant(Enchantment.OXYGEN, 3, true);
        leviathanMeta.addEnchant(Enchantment.WATER_WORKER, 1, true);

        leviathan.setItemMeta(leviathanMeta);
        return leviathan;
    }

    public ShapedRecipe LeviathanRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Leviathan());
        recipe.shape("LWL", "DXD", "P P");
        recipe.setIngredient('L', Material.LAPIS_BLOCK);
        recipe.setIngredient('W', Material.WATER_BUCKET);
        recipe.setIngredient('X', Material.DIAMOND_LEGGINGS);
        recipe.setIngredient('P', Material.LILY_PAD);
        recipe.setIngredient('D', Material.DIAMOND);
        return recipe;
    }

    public ItemStack Perun() {
        ItemStack perun = new ItemStack(Material.DIAMOND_AXE);
        ItemMeta perunMeta = perun.getItemMeta();

        assert perunMeta != null;
        perunMeta.setDisplayName(Util.getStr("Perun"));
        perunMeta.addEnchant(Enchantment.DURABILITY, 1, true);
        perunMeta.setLore(Util.getStr("Perun", true));

        perun.setItemMeta(perunMeta);
        return perun;
    }

    public ShapedRecipe PerunRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Perun());
        recipe.shape("DTF", "DS ", " S ");
        recipe.setIngredient('D', Material.DIAMOND);
        recipe.setIngredient('T', Material.TNT);
        recipe.setIngredient('F', Material.FIRE_CHARGE);
        recipe.setIngredient('S', Material.STICK);
        return recipe;
    }

    public ItemStack Excalibur() {
        ItemStack excalibur = new ItemStack(Material.DIAMOND_SWORD);
        ItemMeta excaliburMeta = excalibur.getItemMeta();

        assert excaliburMeta != null;
        excaliburMeta.setDisplayName(Util.getStr("Excalibur"));
        excaliburMeta.addEnchant(Enchantment.DURABILITY, 1, true);
        excaliburMeta.setLore(Util.getStr("Excalibur", true));

        excalibur.setItemMeta(excaliburMeta);
        return excalibur;
    }

    public ShapedRecipe ExcaliburRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Excalibur());
        recipe.shape("SFS", "STS", "SDS");
        recipe.setIngredient('D', Material.DIAMOND_SWORD);
        recipe.setIngredient('T', Material.TNT);
        recipe.setIngredient('F', Material.FIRE_CHARGE);
        recipe.setIngredient('S', Material.SOUL_SAND);
        return recipe;
    }

    public ItemStack Anduril() {
        ItemStack anduril = new ItemStack(Material.IRON_SWORD);
        ItemMeta andurilMeta = anduril.getItemMeta();

        assert andurilMeta != null;
        andurilMeta.setDisplayName(Util.getStr("Anduril"));
        andurilMeta.addEnchant(Enchantment.DAMAGE_ALL, 2, true);
        andurilMeta.setLore(Util.getStr("Anduril", true));

        anduril.setItemMeta(andurilMeta);
        return anduril;
    }

    public ShapedRecipe AndurilRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Anduril());
        recipe.shape("FIF", "FIF", "FBF");
        recipe.setIngredient('F', Material.FEATHER);
        recipe.setIngredient('I', Material.IRON_BLOCK);
        recipe.setIngredient('B', Material.BLAZE_ROD);
        return recipe;
    }

    public ItemStack Scythe() {
        ItemStack scythe = new ItemStack(Material.IRON_HOE);
        ItemMeta scytheMeta = scythe.getItemMeta();

        assert scytheMeta != null;
        scytheMeta.setDisplayName(Util.getStr("Scythe"));
        scytheMeta.setLore(Util.getStr("Scythe", true));

        scythe.setItemMeta(scytheMeta);
        return scythe;
    }

    public ShapedRecipe ScytheRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Scythe());
        recipe.shape(" PP", " BC", "B  ");
        recipe.setIngredient('P', Material.PLAYER_HEAD);
        recipe.setIngredient('B', Material.BONE);
        recipe.setIngredient('C', Material.CLOCK);
        return recipe;
    }

    public ItemStack Machina() {
        ItemStack machina = new ItemStack(Material.POTION);
        PotionMeta machinaMeta = (PotionMeta) machina.getItemMeta();

        assert machinaMeta != null;
        machinaMeta.addCustomEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 10 * 20, 3), true);
        machinaMeta.setDisplayName(Util.getStr("Machina"));
        machinaMeta.addEnchant(Enchantment.DURABILITY, 1, true);
        machinaMeta.setColor(Color.BLUE);

        machina.setItemMeta(machinaMeta);
        return machina;
    }

    public ShapedRecipe MachinaRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Machina());
        recipe.shape(" E ", " P ", " B ");
        recipe.setIngredient('P', Material.PLAYER_HEAD);
        recipe.setIngredient('B', Material.GLASS_BOTTLE);
        recipe.setIngredient('E', Material.EMERALD);
        return recipe;
    }

    public ItemStack KingofRod() {
        ItemStack kingofRod = new ItemStack(Material.FISHING_ROD);
        ItemMeta kingofRodMeta = kingofRod.getItemMeta();

        Objects.requireNonNull(kingofRodMeta).setDisplayName(Util.getStr("KingofRod"));
        kingofRodMeta.addEnchant(Enchantment.LUCK, 10, true);
        kingofRodMeta.addEnchant(Enchantment.DURABILITY, 10, true);
        kingofRodMeta.addEnchant(Enchantment.LURE, 5, true);

        kingofRod.setItemMeta(kingofRodMeta);
        return kingofRod;
    }

    public ShapedRecipe KingofRodRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(KingofRod());
        recipe.shape(" F ", "LCL", " W ");
        recipe.setIngredient('F', Material.FISHING_ROD);
        recipe.setIngredient('L', Material.LILY_PAD);
        recipe.setIngredient('C', Material.COMPASS);
        recipe.setIngredient('W', Material.WATER_BUCKET);
        return recipe;
    }

    public ItemStack Vidar() {
        ItemStack vidar = new ItemStack(Material.DIAMOND_BOOTS);
        ItemMeta vidarMeta = vidar.getItemMeta();

        assert vidarMeta != null;
        vidarMeta.setDisplayName(Util.getStr("Vidar"));
        vidarMeta.addEnchant(Enchantment.DEPTH_STRIDER, 2, true);
        vidarMeta.addEnchant(Enchantment.DURABILITY, 3, true);
        vidarMeta.addEnchant(Enchantment.PROTECTION_PROJECTILE, 2, true);
        vidarMeta.addEnchant(Enchantment.THORNS, 1, true);

        vidar.setItemMeta(vidarMeta);
        return vidar;
    }

    public ShapedRecipe VidarRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Vidar());
        recipe.shape(" P ", "WDW", " F ");
        recipe.setIngredient('F', Material.FISHING_ROD);
        recipe.setIngredient('P', Material.PUFFERFISH);
        recipe.setIngredient('D', Material.DIAMOND_BOOTS);
        recipe.setIngredient('W', Material.POTION);
        return recipe;
    }

    public ItemStack Vitality() {
        ItemStack vitality = new ItemStack(Material.SPLASH_POTION);
        PotionMeta vitalityMeta = (PotionMeta) vitality.getItemMeta();

        assert vitalityMeta != null;
        vitalityMeta.addCustomEffect(new PotionEffect(PotionEffectType.SPEED, 12 * 20, 1), true);
        vitalityMeta.addCustomEffect(new PotionEffect(PotionEffectType.REGENERATION, 8 * 20, 1), true);
        vitalityMeta.addCustomEffect(new PotionEffect(PotionEffectType.WEAKNESS, 12 * 20, 1), true);
        vitalityMeta.addCustomEffect(new PotionEffect(PotionEffectType.WITHER, 6 * 20, 1), true);
        vitalityMeta.setColor(Color.BLACK);

        vitalityMeta.setDisplayName(Util.getStr("Vitality"));

        vitality.setItemMeta(vitalityMeta);
        return vitality;
    }

    public ShapedRecipe VitalityRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Vitality());
        recipe.shape(" S ", " W ", " B ");
        recipe.setIngredient('S', Material.WITHER_SKELETON_SKULL);
        recipe.setIngredient('W', Material.NETHER_WART);
        recipe.setIngredient('B', Material.GLASS_BOTTLE);
        return recipe;
    }

    public ItemStack Miner() {
        ItemStack miner = new ItemStack(Material.DIAMOND_PICKAXE);
        ItemMeta minerdMeta = miner.getItemMeta();

        assert minerdMeta != null;
        minerdMeta.setDisplayName(Util.getStr("Miner"));
        minerdMeta.setLore(Util.getStr("Miner", true));

        miner.setItemMeta(minerdMeta);
        return miner;
    }

    public ShapedRecipe MinerRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Miner());
        recipe.shape("ESE", "EPE", "BBB");
        recipe.setIngredient('S', Material.IRON_SWORD);
        recipe.setIngredient('E', Material.EXPERIENCE_BOTTLE);
        recipe.setIngredient('P', Material.DIAMOND_PICKAXE);
        recipe.setIngredient('B', Material.BOOKSHELF);
        return recipe;
    }

    public ItemStack Bloodlust() {
        ItemStack bloodlust = new ItemStack(Material.DIAMOND_SWORD);
        ItemMeta bloodlustMeta = bloodlust.getItemMeta();

        assert bloodlustMeta != null;
        bloodlustMeta.setDisplayName(Util.getStr("Bloodlust"));
        bloodlustMeta.setLore(Util.getStr("Bloodlust", true));
        bloodlustMeta.addEnchant(Enchantment.DAMAGE_ALL, 1, true);
        bloodlustMeta.setCustomModelData(0);

        bloodlust.setItemMeta(bloodlustMeta);
        return bloodlust;
    }

    public ShapedRecipe BloodlustRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Bloodlust());
        recipe.shape("RDR", "RSR", "RER");
        recipe.setIngredient('R', Material.REDSTONE_BLOCK);
        recipe.setIngredient('D', Material.DIAMOND);
        recipe.setIngredient('S', Material.DIAMOND_SWORD);
        recipe.setIngredient('E', Material.EXPERIENCE_BOTTLE);
        return recipe;
    }

    public ItemStack Modular() {
        ItemStack modular = new ItemStack(Material.BOW);
        ItemMeta modularMeta = modular.getItemMeta();

        assert modularMeta != null;
        modularMeta.setDisplayName(Util.getStr("Modular"));
        modularMeta.addEnchant(Enchantment.ARROW_KNOCKBACK, 1, true);
        modularMeta.setCustomModelData(3);
        modularMeta.setLore(Util.getStr("Modular", true));

        modular.setItemMeta(modularMeta);
        return modular;
    }

    public ShapedRecipe ModularRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Modular());
        recipe.shape(" C ", "PBP", "ESE");
        recipe.setIngredient('C', Material.CLOCK);
        recipe.setIngredient('P', Material.BLAZE_POWDER);
        recipe.setIngredient('B', Material.BOW);
        recipe.setIngredient('E', Material.SPIDER_EYE);
        recipe.setIngredient('S', Material.SLIME_BALL);
        return recipe;
    }

    public ItemStack Hermes() {
        ItemStack hermes = new ItemStack(Material.DIAMOND_BOOTS);
        ItemMeta hermesMeta = hermes.getItemMeta();
        assert hermesMeta != null;
        hermesMeta.setDisplayName(Util.getStr("Hermes"));
        hermesMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2, true);
        hermesMeta.addEnchant(Enchantment.PROTECTION_FALL, 1, true);
        hermesMeta.addEnchant(Enchantment.DURABILITY, 2, true);
        hermesMeta.setLore(Util.getStr("Hermes", true));

        hermes.setItemMeta(hermesMeta);
        return hermes;
    }

    public ShapedRecipe HermesRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Hermes());
        recipe.shape("DPD", "BXB", "F F");
        recipe.setIngredient('P', Material.PLAYER_HEAD);
        recipe.setIngredient('B', Material.BLAZE_POWDER);
        recipe.setIngredient('F', Material.FEATHER);
        recipe.setIngredient('D', Material.DIAMOND);
        recipe.setIngredient('X', Material.DIAMOND_BOOTS);
        return recipe;
    }

    public ItemStack Barbarian() {
        ItemStack barbarian = new ItemStack(Material.DIAMOND_CHESTPLATE);
        ItemMeta barbarianMeta = barbarian.getItemMeta();

        assert barbarianMeta != null;
        barbarianMeta.setDisplayName(Util.getStr("Barbarian"));
        barbarianMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 1, true);
        barbarianMeta.setLore(Util.getStr("Barbarian", true));

        barbarian.setItemMeta(barbarianMeta);
        return barbarian;
    }

    public ShapedRecipe BarbarianRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Barbarian());
        recipe.shape("BCB", "ISI");
        recipe.setIngredient('C', Material.DIAMOND_CHESTPLATE);
        recipe.setIngredient('B', Material.BLAZE_ROD);
        recipe.setIngredient('I', Material.IRON_BLOCK);
        ItemStack stpot = new ItemStack(Material.POTION, 1, (short) 9);
        recipe.setIngredient('S', Objects.requireNonNull(stpot.getData()));
        return recipe;
    }

    public ItemStack Cupid() {
        ItemStack cupid = new ItemStack(Material.BOW);
        ItemMeta cupidMeta = cupid.getItemMeta();

        assert cupidMeta != null;
        cupidMeta.addEnchant(Enchantment.ARROW_DAMAGE, 2, true);
        cupidMeta.addEnchant(Enchantment.ARROW_FIRE, 1, true);
        cupidMeta.setDisplayName(Util.getStr("Cupid"));

        cupid.setItemMeta(cupidMeta);
        return cupid;
    }

    public ShapedRecipe CupidRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Cupid());
        recipe.shape(" R ", "PBP", " L ");
        recipe.setIngredient('P', Material.PLAYER_HEAD);
        recipe.setIngredient('R', Material.BLAZE_ROD);
        recipe.setIngredient('B', Material.BOW);
        recipe.setIngredient('L', Material.LAVA_BUCKET);
        return recipe;
    }

    public ItemStack Artemis() {
        ItemStack artemis = new ItemStack(Material.BOW);
        ItemMeta artemisMeta = artemis.getItemMeta();

        assert artemisMeta != null;
        artemisMeta.addEnchant(Enchantment.ARROW_DAMAGE, 3, true);
        artemisMeta.setDisplayName(Util.getStr("Artemis"));
        artemisMeta.setLore(Util.getStr("Artemis", true));

        artemis.setItemMeta(artemisMeta);
        return artemis;
    }

    public ShapedRecipe ArtemisRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Artemis());
        recipe.shape("FDF", "FBF", "FEF");
        recipe.setIngredient('F', Material.FEATHER);
        recipe.setIngredient('D', Material.DIAMOND);
        recipe.setIngredient('B', Material.BOW);
        recipe.setIngredient('E', Material.ENDER_EYE);
        return recipe;
    }

    public ItemStack GoldenHead() {
        ItemStack goldenHead = new ItemStack(Material.PLAYER_HEAD);
        SkullMeta goldenHeadMeta = (SkullMeta) goldenHead.getItemMeta();

        assert goldenHeadMeta != null;
        //https://api.mojang.com/users/profiles/minecraft/LegendaryJulien
        goldenHeadMeta.setOwningPlayer(plugin.getServer().getOfflinePlayer("LegendaryJulien"));
        goldenHeadMeta.setDisplayName(Util.getStr("GoldenHead"));
        goldenHeadMeta.setLore(Util.getStr("GoldenHead", true));
        goldenHead.setItemMeta(goldenHeadMeta);

        return goldenHead;
    }

    public ShapedRecipe GoldenHeadRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(GoldenHead());
        recipe.shape("ggg", "gpg", "ggg");
        recipe.setIngredient('g', Material.GOLD_INGOT);
        recipe.setIngredient('p', Material.PLAYER_HEAD);
        return recipe;
    }

    public ItemStack Power() {
        ItemStack power = new ItemStack(Material.ENCHANTED_BOOK);
        EnchantmentStorageMeta powerMeta = (EnchantmentStorageMeta) power.getItemMeta();
        assert powerMeta != null;
        powerMeta.addStoredEnchant(Enchantment.ARROW_DAMAGE, 1, true);
        powerMeta.setDisplayName(Util.getStr("Power"));
        power.setItemMeta(powerMeta);
        return power;
    }

    public ShapedRecipe PowerRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Power());
        recipe.shape("F  ", " PP", " PB");
        recipe.setIngredient('F', Material.FLINT);
        recipe.setIngredient('B', Material.BONE);
        recipe.setIngredient('P', Material.PAPER);
        return recipe;
    }

    public ItemStack FusionArmor() {
        ItemStack fusionItem = new ItemStack(Material.DIAMOND_CHESTPLATE);
        ItemMeta fusionItemMeta = fusionItem.getItemMeta();

        assert fusionItemMeta != null;
        fusionItemMeta.setDisplayName(Util.getStr("FusionArmor"));
        fusionItemMeta.setLore(Util.getStr("FusionArmor", true));

        fusionItem.setItemMeta(fusionItemMeta);
        return fusionItem;
    }

    public ShapelessRecipe FusionArmorRecipe() {
        ShapelessRecipe recipe = new ShapelessRecipe(FusionArmor());
        RecipeChoice diamondPieces = new RecipeChoice.MaterialChoice(Material.DIAMOND_HELMET, Material.DIAMOND_CHESTPLATE, Material.DIAMOND_LEGGINGS, Material.DIAMOND_BOOTS);
        recipe.addIngredient(diamondPieces);
        recipe.addIngredient(diamondPieces);
        recipe.addIngredient(diamondPieces);
        recipe.addIngredient(diamondPieces);
        recipe.addIngredient(diamondPieces);
        return recipe;
    }

    public static ItemStack FusionHelmet() {
        ItemStack fusionHelmet = new ItemStack(Material.DIAMOND_HELMET);
        ItemMeta fusionHelmetMeta = fusionHelmet.getItemMeta();

        assert fusionHelmetMeta != null;
        fusionHelmetMeta.setDisplayName(Util.getStr("FusionHelmet"));
        fusionHelmetMeta.setLore(Util.getStr("FusionHelmet", true));
        fusionHelmetMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 5, true);

        fusionHelmet.setItemMeta(fusionHelmetMeta);
        return fusionHelmet;
    }

    public static ItemStack FusionChestPlate() {
        ItemStack fusionChestPlate = new ItemStack(Material.DIAMOND_CHESTPLATE);
        ItemMeta fusionChestPlateMeta = fusionChestPlate.getItemMeta();

        assert fusionChestPlateMeta != null;
        fusionChestPlateMeta.setDisplayName(Util.getStr("FusionChestPlate"));
        fusionChestPlateMeta.setLore(Util.getStr("FusionChestPlate", true));
        fusionChestPlateMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 5, true);

        fusionChestPlate.setItemMeta(fusionChestPlateMeta);
        return fusionChestPlate;
    }

    public static ItemStack FusionLeggings() {
        ItemStack fusionLeggings = new ItemStack(Material.DIAMOND_LEGGINGS);
        ItemMeta fusionLeggingsMeta = fusionLeggings.getItemMeta();

        assert fusionLeggingsMeta != null;
        fusionLeggingsMeta.setDisplayName(Util.getStr("FusionLeggings"));
        fusionLeggingsMeta.setLore(Util.getStr("FusionLeggings", true));
        fusionLeggingsMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 5, true);

        fusionLeggings.setItemMeta(fusionLeggingsMeta);
        return fusionLeggings;
    }

    public static ItemStack FusionBoots() {
        ItemStack fusionBoots = new ItemStack(Material.DIAMOND_BOOTS);
        ItemMeta fusionBootsMeta = fusionBoots.getItemMeta();

        assert fusionBootsMeta != null;
        fusionBootsMeta.setDisplayName(Util.getStr("FusionBoots"));
        fusionBootsMeta.setLore(Util.getStr("FusionBoots", true));
        fusionBootsMeta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 5, true);

        fusionBoots.setItemMeta(fusionBootsMeta);
        return fusionBoots;
    }

    public ItemStack Nectar() {
        ItemStack nectar = new ItemStack(Material.POTION);
        PotionMeta nectarMeta = (PotionMeta) nectar.getItemMeta();

        assert nectarMeta != null;
        nectarMeta.addCustomEffect(new PotionEffect(PotionEffectType.REGENERATION, 10 * 20, 1), true);
        nectarMeta.setColor(Color.YELLOW);

        nectarMeta.setDisplayName(Util.getStr("Nectar"));

        nectar.setItemMeta(nectarMeta);
        return nectar;
    }

    public ShapedRecipe NectarRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Nectar());
        recipe.shape(" E ", "GMG", " B ");
        recipe.setIngredient('E', Material.EMERALD);
        recipe.setIngredient('G', Material.GOLD_INGOT);
        recipe.setIngredient('M', Material.MELON_SLICE);
        recipe.setIngredient('B', Material.GLASS_BOTTLE);
        return recipe;
    }

    public ItemStack Cornucopia() {
        ItemStack cornucopia = new ItemStack(Material.GOLDEN_CARROT, 3);
        ItemMeta cornucopiaMeta = cornucopia.getItemMeta();

        assert cornucopiaMeta != null;
        cornucopiaMeta.setDisplayName(Util.getStr("Cornucopia"));
        cornucopiaMeta.setLore(Util.getStr("Cornucopia", true));
        cornucopia.setItemMeta(cornucopiaMeta);

        return cornucopia;
    }

    public ShapedRecipe CornucopiaRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(Cornucopia());
        recipe.shape("ccc", "cac", "ccc");
        recipe.setIngredient('c', Material.CARROT);
        recipe.setIngredient('a', Material.GOLDEN_APPLE);
        return recipe;
    }

    public ItemStack LeatherEconomy() {
        ItemStack leather = new ItemStack(Material.LEATHER, 8);
        ItemMeta leatherMeta = leather.getItemMeta();

        assert leatherMeta != null;
        leatherMeta.setDisplayName(Util.getStr("LeatherEconomy"));

        leather.setItemMeta(leatherMeta);
        return leather;
    }

    public ShapedRecipe LeatherRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.LEATHER, 8));
        recipe.shape("SLS", "SLS", "SLS");
        recipe.setIngredient('S', Material.STICK);
        recipe.setIngredient('L', Material.LEATHER);
        return recipe;
    }

    public ItemStack DustOfLight() {
        ItemStack dust = new ItemStack(Material.GLOWSTONE_DUST, 8);
        ItemMeta dustMeta = dust.getItemMeta();

        assert dustMeta != null;
        dustMeta.setDisplayName(Util.getStr("DustOfLight"));

        dust.setItemMeta(dustMeta);
        return dust;
    }

    public ShapedRecipe DustRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.GLOWSTONE_DUST, 8));
        recipe.shape("RRR", "RFR", "RRR");
        recipe.setIngredient('R', Material.REDSTONE);
        recipe.setIngredient('F', Material.FLINT_AND_STEEL);
        return recipe;
    }

    public ItemStack BrewingArtifact() {
        ItemStack wart = new ItemStack(Material.NETHER_WART);
        ItemMeta wartMeta = wart.getItemMeta();

        assert wartMeta != null;
        wartMeta.setDisplayName(Util.getStr("BrewingArtifact"));

        wart.setItemMeta(wartMeta);
        return wart;
    }

    public ShapedRecipe WartRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.NETHER_WART));
        recipe.shape(" S ", "SFS", " S ");
        recipe.setIngredient('S', Material.WHEAT_SEEDS);
        recipe.setIngredient('F', Material.FERMENTED_SPIDER_EYE);
        return recipe;
    }

    public ItemStack DeliciousSteak() {
        ItemStack steak = new ItemStack(Material.COOKED_BEEF, 10);
        ItemMeta steakMeta = steak.getItemMeta();

        assert steakMeta != null;
        steakMeta.setDisplayName(Util.getStr("DeliciousSteak"));

        steak.setItemMeta(steakMeta);
        return steak;
    }

    public ShapedRecipe SteakRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.COOKED_BEEF, 10));
        recipe.shape("FFF", "FCF", "FFF");
        recipe.setIngredient('F', Material.BEEF);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack DeliciousPorkChop() {
        ItemStack porkChop = new ItemStack(Material.COOKED_PORKCHOP, 10);
        ItemMeta porkChopMeta = porkChop.getItemMeta();

        assert porkChopMeta != null;
        porkChopMeta.setDisplayName(Util.getStr("DeliciousPorkChop"));

        porkChop.setItemMeta(porkChopMeta);
        return porkChop;
    }

    public ShapedRecipe PorkChopRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.COOKED_PORKCHOP, 10));
        recipe.shape("FFF", "FCF", "FFF");
        recipe.setIngredient('F', Material.PORKCHOP);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack DeliciousMutton() {
        ItemStack mutton = new ItemStack(Material.COOKED_MUTTON, 10);
        ItemMeta muttonMeta = mutton.getItemMeta();

        assert muttonMeta != null;
        muttonMeta.setDisplayName(Util.getStr("DeliciousMutton"));

        mutton.setItemMeta(muttonMeta);
        return mutton;
    }

    public ShapedRecipe MuttonRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.COOKED_MUTTON, 10));
        recipe.shape("FFF", "FCF", "FFF");
        recipe.setIngredient('F', Material.MUTTON);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack DeliciousChicken() {
        ItemStack chicken = new ItemStack(Material.COOKED_CHICKEN, 10);
        ItemMeta chickenMeta = chicken.getItemMeta();

        assert chickenMeta != null;
        chickenMeta.setDisplayName(Util.getStr("DeliciousChicken"));

        chicken.setItemMeta(chickenMeta);
        return chicken;
    }

    public ShapedRecipe ChickenRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.COOKED_CHICKEN, 10));
        recipe.shape("FFF", "FCF", "FFF");
        recipe.setIngredient('F', Material.CHICKEN);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack DeliciousRabbit() {
        ItemStack rabbit = new ItemStack(Material.COOKED_RABBIT, 10);
        ItemMeta rabbitMeta = rabbit.getItemMeta();

        assert rabbitMeta != null;
        rabbitMeta.setDisplayName(Util.getStr("DeliciousRabbit"));

        rabbit.setItemMeta(rabbitMeta);
        return rabbit;
    }

    public ShapedRecipe RabbitRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.COOKED_RABBIT, 10));
        recipe.shape("FFF", "FCF", "FFF");
        recipe.setIngredient('F', Material.RABBIT);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack DeliciousCod() {
        ItemStack cod = new ItemStack(Material.COOKED_COD, 10);
        ItemMeta codMeta = cod.getItemMeta();

        assert codMeta != null;
        codMeta.setDisplayName(Util.getStr("DeliciousCod"));

        cod.setItemMeta(codMeta);
        return cod;
    }

    public ShapedRecipe CodRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.COOKED_COD, 10));
        recipe.shape("FFF", "FCF", "FFF");
        recipe.setIngredient('F', Material.COD);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack DeliciousSalmon() {
        ItemStack salmon = new ItemStack(Material.COOKED_SALMON, 10);
        ItemMeta salmonMeta = salmon.getItemMeta();

        assert salmonMeta != null;
        salmonMeta.setDisplayName(Util.getStr("DeliciousSalmon"));

        salmon.setItemMeta(salmonMeta);
        return salmon;
    }

    public ShapedRecipe SalmonRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.COOKED_SALMON, 10));
        recipe.shape("FFF", "FCF", "FFF");
        recipe.setIngredient('F', Material.SALMON);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack FlamingArtifact() {
        ItemStack rod = new ItemStack(Material.BLAZE_ROD);
        ItemMeta rodMeta = rod.getItemMeta();

        assert rodMeta != null;
        rodMeta.setDisplayName(Util.getStr("FlamingArtifact"));

        rod.setItemMeta(rodMeta);
        return rod;
    }

    public ShapedRecipe FlamingRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.BLAZE_ROD));
        recipe.shape("OLO", "OFO", "OLO");
        recipe.setIngredient('O', Material.ORANGE_STAINED_GLASS);
        recipe.setIngredient('L', Material.LAVA_BUCKET);
        recipe.setIngredient('F', Material.FIREWORK_ROCKET);
        return recipe;
    }

    public ItemStack IronPack() {
        ItemStack iron = new ItemStack(Material.IRON_INGOT, 10);
        ItemMeta ironMeta = iron.getItemMeta();

        assert ironMeta != null;
        ironMeta.setDisplayName(Util.getStr("IronPack"));

        iron.setItemMeta(ironMeta);
        return iron;
    }

    public ShapedRecipe IronPackRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.IRON_INGOT, 10));
        recipe.shape("OOO", "OCO", "OOO");
        recipe.setIngredient('O', Material.IRON_ORE);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack Obsidian() {
        ItemStack obsidian = new ItemStack(Material.OBSIDIAN);
        ItemMeta obsidianMeta = obsidian.getItemMeta();

        assert obsidianMeta != null;
        obsidianMeta.setDisplayName(Util.getStr("Obsidian"));

        obsidian.setItemMeta(obsidianMeta);
        return obsidian;
    }

    public ShapedRecipe ObsidianRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.OBSIDIAN));
        recipe.shape("W", "L");
        recipe.setIngredient('W', Material.WATER_BUCKET);
        recipe.setIngredient('L', Material.LAVA_BUCKET);
        return recipe;
    }

    public ItemStack EnlighteningPack() {
        ItemStack experienceBottle = new ItemStack(Material.EXPERIENCE_BOTTLE, 8);
        ItemMeta experienceBottleMeta = experienceBottle.getItemMeta();

        assert experienceBottleMeta != null;
        experienceBottleMeta.setDisplayName(Util.getStr("EnlighteningPack"));

        experienceBottle.setItemMeta(experienceBottleMeta);
        return experienceBottle;
    }

    public ShapedRecipe ExperienceBottleRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.EXPERIENCE_BOTTLE, 8));
        recipe.shape(" R ", "RBR", " R ");
        recipe.setIngredient('R', Material.REDSTONE_BLOCK);
        recipe.setIngredient('B', Material.GLASS_BOTTLE);
        return recipe;
    }

    public ItemStack LightAnvil() {
        ItemStack lightAnvil = new ItemStack(Material.ANVIL);
        ItemMeta lightAnvilMeta = lightAnvil.getItemMeta();

        assert lightAnvilMeta != null;
        lightAnvilMeta.setDisplayName(Util.getStr("LightAnvil"));

        lightAnvil.setItemMeta(lightAnvilMeta);
        return lightAnvil;
    }

    public ShapedRecipe LightAnvilRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.ANVIL));
        recipe.shape("III", " B ", "III");
        recipe.setIngredient('I', Material.IRON_INGOT);
        recipe.setIngredient('B', Material.IRON_BLOCK);
        return recipe;
    }

    public ItemStack LightEnchantmentTable() {
        ItemStack enchantingTable = new ItemStack(Material.ENCHANTING_TABLE);
        ItemMeta enchantingTableMeta = enchantingTable.getItemMeta();

        assert enchantingTableMeta != null;
        enchantingTableMeta.setDisplayName(Util.getStr("LightEnchantmentTable"));

        enchantingTable.setItemMeta(enchantingTableMeta);
        return enchantingTable;
    }

    public ShapedRecipe LightEnchantmentTableRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.ENCHANTING_TABLE));
        recipe.shape(" B ", "ODO", "OEO");
        recipe.setIngredient('B', Material.BOOKSHELF);
        recipe.setIngredient('O', Material.OBSIDIAN);
        recipe.setIngredient('D', Material.DIAMOND);
        recipe.setIngredient('E', Material.EXPERIENCE_BOTTLE);
        return recipe;
    }

    public ItemStack Temptation() {
        ItemStack apple = new ItemStack(Material.APPLE, 2);
        ItemMeta appleMeta = apple.getItemMeta();

        assert appleMeta != null;
        appleMeta.setDisplayName(Util.getStr("Temptation"));

        apple.setItemMeta(appleMeta);
        return apple;
    }

    public ShapelessRecipe TemptationRecipe() {
        ShapelessRecipe recipe = new ShapelessRecipe(new ItemStack(Material.APPLE, 2));
        recipe.addIngredient(Material.BONE_MEAL);
        recipe.addIngredient(Material.APPLE);
        return recipe;
    }

    public ItemStack LightApple() {
        ItemStack lightApple = new ItemStack(Material.GOLDEN_APPLE);
        ItemMeta lightAppleMeta = lightApple.getItemMeta();

        assert lightAppleMeta != null;
        lightAppleMeta.setDisplayName(Util.getStr("LightApple"));

        lightApple.setItemMeta(lightAppleMeta);
        return lightApple;
    }

    public ShapedRecipe LightAppleRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.GOLDEN_APPLE));
        recipe.shape(" G ", "GAG", " G ");
        recipe.setIngredient('G', Material.GOLD_INGOT);
        recipe.setIngredient('A', Material.APPLE);
        return recipe;
    }

    public ItemStack LightEnchantingApple() {
        ItemStack lightEnchantingApple = new ItemStack(Material.ENCHANTED_GOLDEN_APPLE);
        ItemMeta lightEnchantingAppleMeta = lightEnchantingApple.getItemMeta();

        assert lightEnchantingAppleMeta != null;
        lightEnchantingAppleMeta.setDisplayName(Util.getStr("LightEnchantingApple"));

        lightEnchantingApple.setItemMeta(lightEnchantingAppleMeta);
        return lightEnchantingApple;
    }

    public ShapedRecipe LightEnchantingAppleRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.ENCHANTED_GOLDEN_APPLE));
        recipe.shape(" G ", "GAG", " G ");
        recipe.setIngredient('G', Material.GOLD_BLOCK);
        recipe.setIngredient('A', Material.GOLDEN_APPLE);
        return recipe;
    }

    public ItemStack ArrowEconomy() {
        ItemStack arrow = new ItemStack(Material.ARROW, 20);
        ItemMeta arrowMeta = arrow.getItemMeta();

        assert arrowMeta != null;
        arrowMeta.setDisplayName(Util.getStr("ArrowEconomy"));

        arrow.setItemMeta(arrowMeta);
        return arrow;
    }

    public ShapedRecipe ArrowRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.ARROW, 20));
        recipe.shape("AAA", "SSS", "BBB");
        recipe.setIngredient('A', Material.FLINT);
        recipe.setIngredient('S', Material.STICK);
        recipe.setIngredient('B', Material.FEATHER);
        return recipe;
    }

    public ItemStack Saddle() {
        ItemStack saddle = new ItemStack(Material.SADDLE);
        ItemMeta saddleMeta = saddle.getItemMeta();

        assert saddleMeta != null;
        saddleMeta.setDisplayName(Util.getStr("Saddle"));

        saddle.setItemMeta(saddleMeta);
        return saddle;
    }

    public ShapedRecipe SaddleRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.SADDLE));
        recipe.shape("LLL", "SLS", "I I");
        recipe.setIngredient('L', Material.LEATHER);
        recipe.setIngredient('S', Material.STRING);
        recipe.setIngredient('I', Material.IRON_INGOT);
        return recipe;
    }

    public ItemStack GoldPack() {
        ItemStack gold = new ItemStack(Material.GOLD_INGOT, 10);
        ItemMeta goldMeta = gold.getItemMeta();

        assert goldMeta != null;
        goldMeta.setDisplayName(Util.getStr("GoldPack"));

        gold.setItemMeta(goldMeta);
        return gold;
    }

    public ShapedRecipe GoldPackRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.GOLD_INGOT, 10));
        recipe.shape("OOO", "OCO", "OOO");
        recipe.setIngredient('O', Material.GOLD_ORE);
        recipe.setIngredient('C', Material.COAL_BLOCK);
        return recipe;
    }

    public ItemStack SugarRush() {
        ItemStack sugarCane = new ItemStack(Material.SUGAR_CANE, 4);
        ItemMeta sugarCaneMeta = sugarCane.getItemMeta();

        assert sugarCaneMeta != null;
        sugarCaneMeta.setDisplayName(Util.getStr("SugarRush"));

        sugarCane.setItemMeta(sugarCaneMeta);
        return sugarCane;
    }

    public ShapedRecipe SugarRushRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.SUGAR_CANE, 4));
        recipe.shape(" O ", "WSW");
        recipe.setIngredient('O', Material.OAK_SAPLING);
        recipe.setIngredient('W', Material.WHEAT_SEEDS);
        recipe.setIngredient('S', Material.SUGAR);
        return recipe;
    }

    public ItemStack Elytra() {
        ItemStack sugarCane = new ItemStack(Material.ELYTRA);
        ItemMeta sugarCaneMeta = sugarCane.getItemMeta();

        assert sugarCaneMeta != null;
        sugarCaneMeta.setDisplayName(Util.getStr("Elytra"));

        sugarCane.setItemMeta(sugarCaneMeta);
        return sugarCane;
    }

    public ShapedRecipe ElytraRecipe() {
        ShapedRecipe recipe = new ShapedRecipe(new ItemStack(Material.ELYTRA));
        recipe.shape("PSP", "PXP", "PSP");
        recipe.setIngredient('P', Material.PHANTOM_MEMBRANE);
        recipe.setIngredient('S', Material.SHULKER_SHELL);
        recipe.setIngredient('X', Material.SADDLE);
        return recipe;
    }
}
